#pragma once
#include "Estruturas.h"
#include "Utilitarios.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

Captura lerCapturaArquivo(FILE *file,char *valido){
    Captura captura;
    fread(&captura.id,sizeof(captura.id),1,file);
    fread(&captura.idIndividuo,sizeof(captura.idIndividuo),1,file); 
    fread(&captura.comprimento,sizeof(captura.comprimento),1,file);
    fread(&captura.largura,sizeof(captura.largura),1,file);
    fread(&captura.peso,sizeof(captura.peso),1,file);
    fread(&captura.data,sizeof(captura.data),1,file);    
    unsigned char compStringLocal;    
    fread(&compStringLocal,sizeof(compStringLocal),1,file);    
    captura.local = malloc(compStringLocal+1);
    fread(captura.local,compStringLocal,1,file);
    captura.local[compStringLocal] = '\0';
    fread(valido,sizeof(*valido),1,file);    
    return captura;
}

void desalocaCaptura(Captura captura){
  free(captura.local);
}

Captura lerCapturaID(FILE *file, int idCaptura){
  Captura captura;
  captura.id = -1;
  int encontrou = 0;
  char valido = 0;
  fseek(file,0,SEEK_SET);
  
  while((!encontrou) && (!feof(file))){
    captura = lerCapturaArquivo(file, &valido);
    encontrou = (captura.id == idCaptura) && (valido);
    if(!encontrou){
      desalocaCaptura(captura);
      captura.id = -1;
    }
  }
  
  return captura;
}

void gravaCapturaArquivo(FILE *file, Captura captura){
  fseek(file,0,SEEK_END);   
  fwrite(&captura.id,sizeof(captura.id),1,file);
  fwrite(&captura.idIndividuo,sizeof(captura.idIndividuo),1,file);
  fwrite(&captura.comprimento,sizeof(captura.comprimento),1,file);
  fwrite(&captura.largura,sizeof(captura.largura),1,file);
  fwrite(&captura.peso,sizeof(captura.peso),1,file);
  fwrite(&captura.data,sizeof(captura.data),1,file);
  unsigned char compStringLocal = strlen(captura.local);  
  fwrite(&compStringLocal,sizeof(compStringLocal),1,file);
  fwrite(captura.local,compStringLocal,1,file);
  char valido = 1;
  fwrite(&valido,sizeof(valido),1,file);  
}

int removeCapturaID(FILE *file, int idCaptura){
  fseek(file,0,SEEK_SET);   
  Captura captura = lerCapturaID(file, idCaptura);
  if (captura.id == -1){
    return 0;
  }
  fseek(file,-1,SEEK_CUR);
  char valido = 0;
  fwrite(&valido,sizeof(valido),1,file);  
  return 1;
}

int novoIDCaptura(){
    static int id = 0;
    return id++;
}

void escreveArquivoCap(FILE *file){  
  int idCaptura = novoIDCaptura();  
  int idInd;
  int comprimento;
  int largura;
  int peso;
  int dataano;
  int datames;
  int datadia;
  int datahora;
  int datamin;
  char local[250];  
    
  Captura novaCaptura;
    
  printf("\nDigite o id do individuo: ");
  scanf("%d", &idInd);
  
  printf("\nDigite o comprimento: ");
  scanf("%d", &comprimento);
  
  printf("\nDigite a largura: ");
  scanf("%d", &largura);
  
  printf("\nDigite o peso: ");
  scanf("%d", &peso);
  
  printf("\nDigite o ano: ");
  scanf("%d", &dataano);
  
  printf("\nDigite o mes: ");
  scanf("%d", &datames);
  
  printf("\nDigite o dia: ");
  scanf("%d", &datadia);
  
  printf("\nDigite a hora: ");
  scanf("%d", &datahora);
  
  printf("\nDigite o minuto: ");
  scanf("%d", &datamin);
  
  printf("\nDigite o local: ");
  scanf("%s",local);
  
  
  
  novaCaptura.id = idCaptura;
  novaCaptura.idIndividuo = idInd;
  novaCaptura.comprimento = comprimento;
  novaCaptura.largura = largura;
  novaCaptura.peso = peso;
  novaCaptura.data.ano = dataano;
  novaCaptura.data.mes = datames;
  novaCaptura.data.dia = datadia;
  novaCaptura.data.hora = datahora;
  novaCaptura.data.min = datamin;
  novaCaptura.local = local;
  
  gravaCapturaArquivo(file,novaCaptura);

  
}

//Funcao de teste
void lerArquivoCap(){
  char valido = 1;
  FILE *file = fopen("capturas.data","r");
  Captura captura1 = lerCapturaArquivo(file, &valido);
  Captura captura2 = lerCapturaArquivo(file, &valido);
  printf("Id %d - comprimento: %d local %s\n", captura1.id,captura1.comprimento, captura1.local);
  printf("Id %d - comprimento: %d local %s\n", captura2.id,captura2.comprimento, captura2.local);
}

//Funcao de teste
void buscaArquivoCap(){
  FILE *file = fopen("capturas.data","r");
  Captura captura2 = lerCapturaID(file,1);
  if(captura2.id != -1){
    printf("Id %d - Local: %s\n", captura2.id, captura2.local);
    desalocaCaptura(captura2);
  }else{
    printf("Captura não encontrada.\n");
  }
  
}

//Funcao de teste
void removeCaptura(){
  FILE *file = fopen("capturas.data","rw+");    
  if (removeCapturaID(file,1)) {
    printf("Removido com sucesso\n");
  }else{
    printf("Não Removido\n");
  }
  fclose(file);
}


/*int main(){
 escreveArquivo(); 
 lerArquivo();
 //removeCaptura();
 buscaArquivo();
}*/